﻿
using DataService.Common;
using DataService.Core.Common;
using DataService.Core.ServiceDTO;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Text;

namespace DataService.DataAccessLayer
{
    public class MySqlProvider : DatabaseProvider
    {
        public override DatabaseType DBType => DatabaseType.MySql;
        public override Type DatabaseProviderType => typeof(MySqlProvider);
        private static DbProviderFactory _Factory;
        public override IsolationLevel _IsolationLevel { get; set; } = IsolationLevel.RepeatableRead;
        /// <summary>工厂</summary>
        public override DbProviderFactory ProviderFactory
        {
            get
            {
                if (_Factory == null)
                {
                    lock (typeof(MySqlProvider))
                    {
                        string dir = FilePathHelper.BasePath + "MySql.Data.dll";
                        _Factory = GetProviderFactory(dir, "MySql.Data.MySqlClient.MySqlClientFactory");
                       // System.Console.WriteLine("实例化MySql驱动工厂");
                    }
                }

                return _Factory;
            }
        }
        //        批量执行更新sql语句的优缺点分析：

        //情况一：mysql 默认是autocommit＝on也就是默认开启自动提交事务。这种情况下，一条sql就会开启一个事务，这时候同时执行一万条update，就会导致实际开启一万个事务，然后挨个执行，挨个开启，挨个提交。

        //缺点：同时锁住数据较少，但是数据库资源占用严重，对外提供操作性能急剧下降。

        //情况二：当autocommit＝off时，同时执行一万条update，那么只会开启一个事务，等到所有都update后，一并commit。

        //缺点：同时锁住数据较多，外面的select进不来，大量连接等待获取行锁，同样影响数据库对外服务能力。
     //   最终优化方案：

　//　建议，把autocommit设置off，然后执行update的时候，手动分批commit，分批条数限制100，或者200，比如一万条update，按照每100条 就commit一次，10000个update总共需要100个事务，每次锁住100条数据。性能将会得到很大提升。
        //conn = DriverManager.getConnection(url, username, password);
        //    conn.setAutoCommit(false);  //关闭自动提交事务

    }
}
